/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI.Jogo;

import Biblioteca.Library;
import Biblioteca.VerificaErros;
import ClassesListas.Pessoas;
import ClassesListas.SubFases;
import ClassesUnicas.Pessoa;
import InstanciaJogo.InstanciaJogoSwing;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE;

/**
 * FrameJogo
 *
 * Versao 1.0
 *
 * Data Criação 25/06/2013
 *
 * @author LupyPaiep
 */
public final class FrameJogo extends javax.swing.JFrame {

    //Atributos
    public static Boolean ocorreuErro = false;
    private InstanciaJogoSwing jogo = null;
    private InstanciaJogoSwing jogoTemporario = null;
    private Pessoas pessoas = null;
    private Pessoa jogador = null;
    private SubFases subFases;

    //Panels
    private FramePanelTrocaFaseSubFase panelTrocaFaseSubFase;
    private FramePanelParametros panelParametros;
    private FramePanelJogoPausado panelJogoPausado;
    private FramePanelIniciarJogo panelIniciarJogo;
    private FramePanelSelecionarJogador panelSelecionarJogador;
    private FramePanelFimJogo panelFimJogo;
    private FramePanelJogo panelJogo;
    

    /**
     * Creates new form FrameJogo
     */
    public FrameJogo() {
        //Desativa Maximizar

        initComponents();

        this.setResizable(false);
        this.setSize(850, 770);

        //Centraliza o FrameJogo na Screem
        this.setLocationRelativeTo(null);

        this.setTitle("Jogo Reconhecimento Facial - TREF " + Library.getConfigTREF("TREF_Versao"));

        ativarPanelParametros();
        
        
        this.pessoas = new Pessoas();
        this.jogador = new Pessoa();

        //Edita o sair da Aplicacao
        this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent evt) {
                for (int i = 0; i < getContentPane().getComponentCount(); i++) {
                    Component comp = getContentPane().getComponent(i);
                    System.out.println(getContentPane().getComponent(i).getName());
                    if (comp instanceof JPanel) {
                        if ((comp == getPanelParametros())
                                || (comp == getPanelSelecionarJogador())
                                || (comp == getPanelIniciarJogo())
                                || (comp == getPanelFimJogo())
                                || ocorreuErro) {
                            fecharAplicacao();
                        } else if ((comp == getPanelJogo())) {
                            if ((getPanelJogo().getLabelImagem().getName().equals("imagemRosto") && getPanelJogo().getLabelImagem().getIcon() != null)|| ocorreuErro) {
                                if (getJogo() != null) {
                                    getJogo().pausarJogo();
                                }
                            }
                        }
                    }
                }
            }
        });
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modifyPai this code. The content of this method is
     * alwayPais regenerated byPai the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Jogo Reconhecimento Facial");
        setResizable(false);
        addWindowStateListener(new java.awt.event.WindowStateListener() {
            public void windowStateChanged(java.awt.event.WindowEvent evt) {
                formWindowStateChanged(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 1018, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 765, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void formWindowStateChanged(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowStateChanged
        // TODO add your handling code here:
    }//GEN-LAST:event_formWindowStateChanged

    //Outros Metodos
    /**
     * Remove todos os panels
     */
    public void desativarTodosPanels() {
        //Impesso a utilizacao do botao fechar, permitido apenas Parametros, SelecaoJogador e NovoJogador
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);

        if (this.getPanelIniciarJogo() != null) {
            this.getContentPane().remove(getPanelIniciarJogo());
        }
        if (this.getPanelJogo() != null) {
            this.getContentPane().remove(getPanelJogo());
        }
        if (this.getPanelFimJogo() != null) {
            this.getContentPane().remove(this.getPanelFimJogo());
        }
        if (this.getPanelTrocaFaseSubFase() != null) {
            this.getContentPane().remove(this.getPanelTrocaFaseSubFase());
        }
        if (this.getPanelParametros() != null) {
            this.getContentPane().remove(this.getPanelParametros());
        }
        if (this.getPanelSelecionarJogador() != null) {
            this.getContentPane().remove(this.getPanelSelecionarJogador());
        }
        if (this.getPanelJogoPausado() != null) {
            this.getContentPane().remove(this.getPanelJogoPausado());
        }
        this.repaint();
    }

    /**
     * Deixa o FramePanelIniciarJogo como visivel no Frame
     */
    public void ativarPanelIniciarJogo() {
        desativarTodosPanels();
        if (getPanelIniciarJogo() == null) {
           setPanelIniciarJogo(new FramePanelIniciarJogo(this));
        }

        getPanelIniciarJogo().getButtonIniciarJogo().setEnabled(true);
        getPanelIniciarJogo().getButtonIniciarJogo().setText("Clique para Iniciar Jogo");
        getPanelIniciarJogo().getButtonVoltarPanelIniciarJogoParaPanelParametros().setEnabled(true);

        this.getContentPane().add(getPanelIniciarJogo(), BorderLayout.CENTER);
        centralizarPanel(this, getPanelIniciarJogo());
        this.repaint();
    }

    /**
     * Deixa o FramePanelJogo como visivel no Frame
     */
    public void ativarPanelJogo() {
        desativarTodosPanels();
        if (getPanelJogo() == null) {
           setPanelJogo(new FramePanelJogo(this));
        }
        //getPanelJogo().getButtonNeutro().setVisible(this.jogo.getFase()!=2);
        //getPanelJogo().getButtonNeutro1().setVisible(this.jogo.getFase()!=2);
        this.getContentPane().add(getPanelJogo(), BorderLayout.CENTER);
        centralizarPanel(this, getPanelJogo());
        this.repaint();
    }

    /**
     * Deixa o FramePanelFimJogo como visivel no Frame
     */
    public void ativarPanelFimJogo() {
        desativarTodosPanels();
        if (getPanelFimJogo() == null) {
           setPanelFimJogo(new FramePanelFimJogo(this));
        }
        this.getContentPane().add(getPanelFimJogo(), BorderLayout.CENTER);
        centralizarPanel(this, getPanelFimJogo());
        this.repaint();
    }

    /**
     * Deixa o FramePanelTrocaFaseSubFase como visivel no Frame
     * Se porcentagem menor que zero, o label fica com escrita vazia
     * @param percAcerto
     */
    public void ativarPanelTrocaFaseSubFase(long percAcerto) {
        desativarTodosPanels();
        if (getPanelTrocaFaseSubFase() == null) {
            setPanelTrocaFaseSubFase(new FramePanelTrocaFaseSubFase(this, percAcerto));
        }
        getPanelTrocaFaseSubFase().mostrarPanelTrocaFaseSubFase(percAcerto);
        this.getContentPane().add(getPanelTrocaFaseSubFase(), BorderLayout.CENTER);
        centralizarPanel(this, getPanelTrocaFaseSubFase());
        this.repaint();
    }

    /**
     * Deixa o FramePanelParametros como visivel no Frame
     */
    public void ativarPanelParametros() {
        desativarTodosPanels();
        if (this.getPanelParametros() == null) {
            this.setPanelParametros(new FramePanelParametros(this));
        }
        this.getContentPane().add(this.getPanelParametros(), BorderLayout.CENTER);
        organizarPanelEsquerdaSuperior(this.getPanelParametros());
        this.repaint();
    }

    /**
     * Deixa o FramePanelSelecionarJogador como visivel no Frame
     */
    public void ativarPanelSelecaoJogador() {
        try {
            desativarTodosPanels();
            if (this.getPanelSelecionarJogador() == null) {
                this.setPanelSelecionarJogador(new FramePanelSelecionarJogador(this));
            }
            if (getPessoas() != null) {
                String idFase = null;
                if (this.panelParametros.getRadioGroupButtonTipoJogo().getSelection() != null) {
                    idFase = this.panelParametros.getRadioGroupButtonTipoJogo().getSelection().getActionCommand();
                }
                getPessoas().setPessoas(getPessoas().getPessoaDAO().buscaPessoas(null, null, idFase, null));
                getPessoas().listarPessoas(getPanelSelecionarJogador().getTableJogadores());
                if (getPanelSelecionarJogador().getTableJogadores().getRowCount() != 0) {
                    getPanelSelecionarJogador().getTableJogadores().setRowSelectionInterval(0, 0);
                }
            }

            this.getContentPane().add(getPanelSelecionarJogador(), BorderLayout.CENTER);
            organizarPanelEsquerdaSuperior(getPanelSelecionarJogador());
            this.repaint();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Deixa o FramePanelJogoPausado como visivel no Frame
     */
    public void ativarPanelJogoPausado() {
        desativarTodosPanels();
        if (this.getPanelJogoPausado() == null) {
            this.setPanelJogoPausado(new FramePanelJogoPausado(this));
        }
        this.getContentPane().add(this.getPanelJogoPausado(), BorderLayout.CENTER);
        centralizarPanel(this, this.getPanelJogoPausado());
        this.repaint();
    }

    /**
     * Organiza o panel no lado esquerdo superior do frame
     *
     * @param jPanelInterno
     */
    public void organizarPanelEsquerdaSuperior(JPanel jPanelInterno) {
        jPanelInterno.setVisible(false);
        jPanelInterno.setVisible(true);
        jPanelInterno.setSize(jPanelInterno.getPreferredSize());
        jPanelInterno.setLocation(0, 0);
    }

    /**
     * Centraliza o jPanelInterno baseado no 'pai'
     *
     * @param pai
     * @param jPanelInterno
     */
    public void centralizarPanel(Component pai, JPanel jPanelInterno) {
        jPanelInterno.setSize(jPanelInterno.getPreferredSize());
        int x = (pai.getWidth() / 2) - (jPanelInterno.getWidth() / 2);
        int y = (pai.getHeight() / 2) - (jPanelInterno.getHeight() / 2);
        jPanelInterno.setLocation(x, y);
        jPanelInterno.setVisible(false);
        jPanelInterno.setVisible(true);
    }

    /**
     * Solicita o fechamento da aplicacao a aplicacao
     */
    public void fecharAplicacao() {
        switch (JOptionPane.showConfirmDialog(null, "Tem certeza que deseja sair ?", "Atenção", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null)) {
            case JOptionPane.YES_OPTION:
                finalizaAplicacao();
                break;
        }
    }

    /**
     * Finaliza a aplicacao
     */
    public void finalizaAplicacao() {
        System.exit(0);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FrameJogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FrameJogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FrameJogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FrameJogo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FrameJogo().setVisible(true);
            }
        });
    }
    
    /**
     * @return the jogo
     */
    public InstanciaJogoSwing getJogo() {
        return jogo;
    }

    /**
     * @param jogo the jogo to set
     */
    public void setJogo(InstanciaJogoSwing jogo) {
        this.jogo = jogo;
    }

    /**
     * @return the jogoTemporario
     */
    public InstanciaJogoSwing getJogoTemporario() {
        return jogoTemporario;
    }

    /**
     * @param jogoTemporario the jogoTemporario to set
     */
    public void setJogoTemporario(InstanciaJogoSwing jogoTemporario) {
        this.jogoTemporario = jogoTemporario;
    }

    /**
     * @return the pessoas
     */
    public Pessoas getPessoas() {
        return pessoas;
    }

    /**
     * @param pessoas the pessoas to set
     */
    public void setPessoas(Pessoas pessoas) {
        this.pessoas = pessoas;
    }

    /**
     * @return the jogador
     */
    public Pessoa getJogador() {
        return jogador;
    }

    /**
     * @param jogador the jogador to set
     */
    public void setJogador(Pessoa jogador) {
        this.jogador = jogador;
    }

    /**
     * @return the subFases
     */
    public SubFases getSubFases() {
        return subFases;
    }

    /**
     * @param subFases the subFases to set
     */
    public void setSubFases(SubFases subFases) {
        this.subFases = subFases;
    }

    /**
     * @return the panelTrocaFaseSubFase
     */
    public FramePanelTrocaFaseSubFase getPanelTrocaFaseSubFase() {
        return panelTrocaFaseSubFase;
    }

    /**
     * @param panelTrocaFaseSubFase the panelTrocaFaseSubFase to set
     */
    public void setPanelTrocaFaseSubFase(FramePanelTrocaFaseSubFase panelTrocaFaseSubFase) {
        this.panelTrocaFaseSubFase = panelTrocaFaseSubFase;
    }

    /**
     * @return the panelParametros
     */
    public FramePanelParametros getPanelParametros() {
        return panelParametros;
    }

    /**
     * @param panelParametros the panelParametros to set
     */
    public void setPanelParametros(FramePanelParametros panelParametros) {
        this.panelParametros = panelParametros;
    }

    /**
     * @return the panelJogoPausado
     */
    public FramePanelJogoPausado getPanelJogoPausado() {
        return panelJogoPausado;
    }

    /**
     * @param panelJogoPausado the panelJogoPausado to set
     */
    public void setPanelJogoPausado(FramePanelJogoPausado panelJogoPausado) {
        this.panelJogoPausado = panelJogoPausado;
    }

    /**
     * @return the panelIniciarJogo1
     */
    public FramePanelIniciarJogo getPanelIniciarJogo() {
        return panelIniciarJogo;
    }

    /**
     * @param panelIniciarJogo1 the panelIniciarJogo1 to set
     */
    public void setPanelIniciarJogo(FramePanelIniciarJogo panelIniciarJogo) {
        this.panelIniciarJogo = panelIniciarJogo;
    }

    /**
     * @return the panelSelecionarJogador
     */
    public FramePanelSelecionarJogador getPanelSelecionarJogador() {
        return panelSelecionarJogador;
    }

    /**
     * @param panelSelecionarJogador the panelSelecionarJogador to set
     */
    public void setPanelSelecionarJogador(FramePanelSelecionarJogador panelSelecionarJogador) {
        this.panelSelecionarJogador = panelSelecionarJogador;
    }

    /**
     * @return the panelFimJogo
     */
    public FramePanelFimJogo getPanelFimJogo() {
        return panelFimJogo;
    }

    /**
     * @param panelFimJogo the panelFimJogo to set
     */
    public void setPanelFimJogo(FramePanelFimJogo panelFimJogo) {
        this.panelFimJogo = panelFimJogo;
    }
    
    /**
     * @return the panelJogo
     */
    public FramePanelJogo getPanelJogo() {
        return panelJogo;
    }

    /**
     * @param panelJogo the panelJogo to set
     */
    public void setPanelJogo(FramePanelJogo panelJogo) {
        this.panelJogo = panelJogo;
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
